вероятность 75% поврежден файл (что-то например лагнуло при сохранении прошлом). Если все в игре идеально работает, то только одно объяснение приходит на ум - темные силы.
Ток бекап, видимо синий экран вылетел в момен когда редактор удалил старую карту и начал создавать новую, сохраняя данные в архив - архив битый, т.к не содержит всех данных, которые не были сохранены редактором.
Если используешь JNGP - то папочка backups в помощь, там твои труды за полгода=)
проведя еще пару часов за тестами, в голову пришла мысль о фаталках из-за большого числа юнитов на мелководье
остановился на том, что ошибка вылетела из-за случайных точек спауна по квадрату на мелко-глубкоководной местности. сделал спаун в отдельных мини областях - ошибка исчезла
Защитить mpq (а карта это тот-же mpq с минимумом отличий) так чтобы его не мог понять никто можно, беда в том, что тогда его не поймет и сам варкрафт. Большинство простых mpq редакторов испоьлзуют ту-же библиотеку для работы с MPQ что и сам варкрафт, что это значит, думаю, догадаться не сложно.
Как вариант, сделать так, что бы модель была разбита на множество текстур которые раскиданы по самым дурацким путям. Ни какой картодел не будет вытаскивать такую модель, ни за что.
quq_CCCP, а можно поподробнее? И это защитит карту от инжекта?
Подробно - это сделай за меня?
Суть:
call BJDebugMsg( I2Sx( 100500 ) )
Выдаст разные значения в депротектнутой и нормальной картах, пока это теория но возьмите и проверьте. I2Sx - фольклорная функция ретурн бага, суть преобразует хеш от строки в строку. именно хеш а не инт. т.е адрес в таблице строк на строку. вот RetunrBug ( www.hiveworkshop.com/threads/accessing-memory-from-the-script-it... ) функция в либе Typecast - I2SH
Ну кароче проверил:
function Trig_J_Test_Actions takes nothing returns nothing
local integer i = 486
local string str = null
set str = S2S( I2SH( i ) )
call BJDebugMsg( str )
set str = null
endfunction
//===========================================================================
function InitTrig_J_Test takes nothing returns nothing
set gg_trg_J_Test = CreateTrigger( )
call TriggerRegisterPlayerEventEndCinematic( gg_trg_J_Test, Player(0) )
call TriggerAddAction( gg_trg_J_Test, function Trig_J_Test_Actions )
endfunction
При добавлении, удалении 3 функций сменяется строка по этому адресу, самое главное найти последнюю строку (ну или как я от балды ввел число) хотя я не уверен что прокатит с числом от балды, нужно найти последнюю строку на момент загрузки карты и смотреть её адрес, а после смотреть что будет записано по этому адресу в таблице строк.
Оказывается можно, просто mdlvis неправильно работает с нормалями, в war3 model editor'е всё корректно отображается.
Чтобы избежать изменение направления нормалей, просто не надо сохранять модель в mdlvis'е.
для блендера есть только один плагин - импортёр...
который глючный и совсем негодный...
напрямую конвертить не получится...
уж тем более с анимациями...
есть вариант конверта в милкшейп (опять че через сторонний аддон), а оттуда в .мдх
конвертит хорошо, с костями, но анимацию убивает...
есть NeoDex для 3dsMax, в котором по плану можно делать всё и конвертить напрямую в .мдх...
повторю опять свой вопрос
у тебя в папке есть файлы формата mpq?
если есть то открой их другим архиватором
если нету то это твои проблемы и никто тебе не поможет
Уже есть самостоятельная идея... По похожему принципу уже действует другой спелл.
Короче, изучается сразу аура, без всяких извращений. А по нажатию кнопки "S" - стоп - она блокируется для игрока и юниту, которому нажали, выдается абила-пустышка, типа аура не действует, снова S - активируется обратно.
Минусы: ни один другой такой же герой того же игрока, пока отключена аура, выучить эту ауру не сможет в это время; иногда приказ стоп действует без ручной активации, что немного неприятно. Но это реально НЕ критично (героев одинаковых у одного игрока почти никогда не бывает, а нажать стоп не проблема, если не задизейблен, ну а что задизейбленным не можешь переключать ауру - фича).
Вот только надо будет еще учесть маловероятный, но все же возможный факт, что юнит с отключенной аурой сможет вообще перестать существовать и тогда ее включить получится в принципе невозможно. Учту периодиком...
Зато ГИГАНТСКАЯ экономия усилий при создании и НИКАКОГО прелоада не надо (в принципе 1-уровневую абилу-пустышку "аура отключена" уж можно не прелоадить, хотя можно и прелоаднуть).
ну да
CHANNEL - CAST - EFFECT - ENDCAST - FINISH
какое-то из них ты будешь использовать для стопа, и все ассоциативные триггшеры выполнятся, но не дальше, само собой.
Оказывается, отрицательную высоту для летающих зданий можно устанавливать, если поставить Art - Elevation - Sample Ponts: 0 SсRealm:
А еще можно повернуть нездание а том сделать зданием и поворот останется , правда в игре может сместитьтя внезапно))
А вместе с этим способом это, вроде бы как, решило мою проблему. Спасибо всем, кто попытался помочь :) Melissa:
И ещё заметка - делать декорации юнитами - больная идея. Если их будет сотня другая - то ещё не конец света, но несколько сотен таких "декораций" - жди проседаний в производительности.
Да там и сотни не наберется, так что все нормально :)
Создать список "станящих" баффов, при потере баффа из этого списка проверять есть у юнита еще какой либо бафф из списка.
Если нет - снимать паузу, если есть - ничего не трогать.
Ааа, ну тогда смотри
не_кликабельность Сларка делается так
а - его морфят в юнит без модельки
б - ему дают москитов и отбирают (что бы на него нельзя было кликнуть, но можно было выделить)
в - все события "атакован" приводятся к действию "стоп", если это Сларк
г - аура регена игнорирует то что Сларка видят
у тебя на пути стоит пункт Б, т.к. что бы умные люди не заменяли себе пустую модельку (пункт А) на нормальную и не могли на неё в итоге тыкать... Так что в итоге - ты можешь её заменить, но тыкнуть всё равно не сможешь... шах и мат
Ааа, ну тогда смотри
не_кликабельность Сларка делается так
а - его морфят в юнит без модельки
б - ему дают москитов и отбирают (что бы на него нельзя было кликнуть, но можно было выделить)
в - все события "атакован" приводятся к действию "стоп", если это Сларк
г - аура регена игнорирует то что Сларка видят
у тебя на пути стоит пункт Б, т.к. что бы умные люди не заменяли себе пустую модельку (пункт А) на нормальную и не могли на неё в итоге тыкать... Так что в итоге - ты можешь её заменить, но тыкнуть всё равно не сможешь... шах и мат
Fireproof, попробуй в РО у юнита поменять "Графика - Анимация - обратный ход броска" и "Графика - Анимация - точка броска" на 0. Правда, это уберёт время каста для всех умений у этого юнита.
Ну чтобы перевести, из градусов в радианы
180° = pi радиан = 3,14...
Если знаешь расположение градусов в окружности (там 2pi = 360°, или pi/2 = 90°)
60° = pi/3 радиан = 3,14/3 = 1,0466
30° = pi/6 радиан = 3,14/6 = 0,5233
Или использовать готовую формулу Angle to Radians => Angle *pi / 180 (формула)
pi/180 = 3,14/180 = 0,01744 (коэффициент, записан в варе в переменную-множитель bj_DEGTORAD)
_________________
Чтобы перевести из радиан в градусы
Использую формулу Radians to Angle => Radians * 180 / pi
1 радиан = 57,32°
0,5 радиан = 0,5 * 180/3,14 = 28,6°
Используют точно также переменную-множитель bj_RADTODEG, но с другим названием. Там было Deg to Rad (перевести в радианы), здесь Rad to Deg (в градусы) тут есть погрешности до десятичных, до сотых и более. Поэтому может не соответствовать. Это как пример. Считал сам. А вообще юзайте готовые переменные и не морочьте голову
код
local unit u = GetTriggerUnit()
local real a = GetUnitFacing(u) * bj_DEGTORAD //GetUitFacing возвращает параметры в градусы, поэтому нужно перевести в радианы
local real x = GetUnitX(u) + 100. * Cos(a)
local real y = GetUnitY(u) + 100. * Sin(a)
//потом то-то делаешь. x, y
xgm.guru/p/wc3/179127тут есть пример карта, на гуи там, но переделать можно и на jass (там кастер двигается в ту сторону, куда смотрит). И пример в качестве кода, если нужно двигать относительно двух точек (сделал пример движение снаряда от Кастера к цели)
Через дамми-каст:
Создаешь пустышку с описанием и передаешь ее герою.
При касте этого спелла создаешь даммика(невидимого/пустого юнита с нужными способностями) и кастуешь нужный спелл.
Дамми при этом занят кастом спелла, а герой может делать все что угодно
ВНЕЗАПНО это делается одним действием: Игра - Enable/Disable Drag-Selection (настроенное на Disable drag-selection functionality (disable drag-selection box)).
Что такое "назначить пользовательский параметр юнита или предмета" и как им пользоваться?
Используется для сохранения каких-нибудь своих данных в этот конкретный предмет или юнита
Добрые люди, как присвоить глобальной переменной (целочисленной) цену определенного предмета (так чтобы если изменить цену в редакторе объектов, то в редакторе триггеров она сама изменялась) или какая главная характеристика определенного героя (разум, сила, ловкость).
название KillUnit не совсем подходит
я бы назвал killUnitFromUnit или просто killFromUnit Пушистый, а можно проще
define KillUnit(a) = KillUnit2(a)
по поводу правил
название должны соответствовать выполняемой функции
например если логическая переменная хранит жив юнит или нет то называться она должна isAlive или как то так
+ различные правила написания для различных языков
например в java первое слово в названии функции/переменной пишется с маленькой буквы а остальные с большой, а в названиях классов все слова с большой
в jass официальных соглашений нету но близы писали в функциях каждое слово с большой а константы большими буквами разделяя слова _
Так ты же выключаешь триггер на 18 секунд вот он и не срабатывает.
Поставь условие, что герыч не имеет абилки-пустышки, если не имеет - дать её и через 18 сек забрать и пустить молнию.
Правда я не уверен насчёт того, отловится ли attacking unit через 18 сек вейта, проверь...
Вообще, если устраивает орбом - то даёшь "сферу молний" с эффектом "цепь молний", у которой 18 сек перезарядка(у цепи не у сферы)
TripleKor, нет, есть действие - скрыть предмет, скрывает предмет с карты, делая невидимым и не выделяемым.
Орбы в как в диабло делаются из юнитов, ну а у героя событие - юнит подошел к другому юниту, условие - подошедший юнит твой дамми предмет, ну и действие думаю понятно...
Все предметы изночально принадлежать враждебным, юзайте Custom value предмета, если 0 то предмет еще никто не подобрал, значит его получили убив монстра или купили, значит ставим ему custom value с номером игрока (нумеруйте не с 0, а с 1). Легко и просто, правда?
.:GreiN:., среди mpq есть порядок обработки и war3patch.mpq имеет высший приоритет среди них
т.е. если текстура есть в war3.mpq и war3patch.mpq то будет использоваться текстура из war3patch.mpq
так что попробуй закинуть текстуру в war3patch.mpq
редактор может тупить с новыми текстурами/моделями
его нужно перезапускать чтобы всё нормально отображалось
проверяй модели и текстуры в игре
Если хочешь качественную анимацию,где двери шлюза закрываются,то сделай двери гармошкой.
А лучше сделать две модели дверей шлюза.Одни двери открыты,а другие закрыты.И менять их видимости в анимах.
анимацию апгрейда можно проиграть
а чтоб постоянная была. то прописыают триггером тэг анимации. или видел как у Иллидана? там два юнита: охотник и демон. Посмотри как у демона сделано. там есть прописано alternate
хм, щас придумаю... Возможно так : создаешь триггер с событием, ну там что-то связаное с улучшением способности (точно не помню). Далее пишешь:
создаешь структуру
создаешь локальный таймер (1-2 сек нормально)
вносишь данные в структуру
запускаешь таймер
добавляешь в структурную группу всех юнитов в регионе ( какой тебе нужно)
ForGroup добавить способность всем юнитам в группе ну и дейсвтия ауры какие там еще....
PS забыл сказать про условие в таймере:
Если у юнита нет способности , то остановить таймер, сломать структуру и тд.
Если тебе не понятно, то завтра могу тебе написать (дай мне знать)
и Еще скажи мне, ты на JNGP работаешь?
ilsva, конечно не сработает
оно всех союзников игрока 1 заставляет считать всех компов союзниками и отдать им контроль над своими войсками.
тебе нужна функция PlayerGroup from Player и поменять порядок - сперва комп, потом игрок (а для надежности можно оба направления). Ну и проверку на то, комп ли игрок делать отдельно через if и условия на Player Controller и Player Slot Status.
Общее поле зрения:
Make 'player' treat 'player2 ' as Противник с общим полем зрения
Общие войска эсть только у союзников, или моих знаний недостаточно для создания общих войск у врагов.
Cпособ #1
Самый простой вариант, это найти и скачать WE Unlimited. Редактор хоть и стар как сам варкрафт. но у него есть так называемый Enchacer. Через данный Enchacer можно вытаскивать любые данные и даже манипулировать импорт и путями. Единственный недостаток, что запускается он не на всех ОС из-за требования каких-то dll которые являются интегрированными в XP, но за каким то чудом нет в остальных Windows, так что придется немного потанцевать с бубном, но потом ты сможешь хоть ландшафт из стандартной карты интегрировать.
Способ #2
MPQ архиватором вскрываешь архив карты и находишь данные о ландшафте и обо всем что на нем стоит. Ищешь или создаешь карту с нужным тебе ландшафтом, и затем интегрируешь все уже в свою карту.
Оба способа требуют манипуляций с файлами, зато позволяет эксплуатировать главную карту как бессмертное ядро, которому надо всего лишь менять внешнюю оболочку в лице ландшафта и декора.
Поскольку его не пугает наличие большого влияния промахов на геймплей - скорее всего он делает рпг. Имхо в рпг всегда клево смотрятся тексттаги полученного урона, для создания которых необходимы триггеры на отлов получения урона. А отлавливаемый урон - можно и прохилить.
Для прохила(и вообще всех манипуляций с задержкой в 0.00 сек) лично я юзаю такие костыли:
Либа здесь только для доп табуляции. Я за чистый жасс + дефайны.
library ZeroTimeEvent
globals
constant integer ZTEArraySize = 64//Even 32 is alot, 64 is too much! Exactly what I need!
timer Zero//Used for 0. sec uses
integer ZTECurrent = 0
unit array ZTEUnits[ZTEArraySize]
integer array ZTEIntegers[ZTEArraySize]
real array ZTEReals[ZTEArraySize]
trigger array ZTETriggers[ZTEArraySize]
endglobals
function ZeroTimeEvent takes nothing returns nothing
loop
set ZTECurrent = ZTECurrent - 1
call TriggerExecute( ZTETriggers[ZTECurrent] )
exitwhen ZTECurrent < 1
endloop
endfunction
#define ZTEAddUnit(u) = {
set ZTEUnits[ZTECurrent] = u
}
#define ZTEAddInteger(i) = {
set ZTEIntegers[ZTECurrent] = i
}
#define ZTEAddReal(r) = {
set ZTEReals[ZTECurrent] = r
}
#define ConfirmZTE(trig) = {
set ZTETriggers[ZTECurrent] = trig
set ZTECurrent = ZTECurrent + 1
call TimerStart( Zero, ZeroTime, false, function ZeroTimeEvent )
}
endlibrary
Это давно обсуждалось. вопрос удаление события
Создание триггер события — 3 утечки. Стереть переменный триггер, и минус 1. Получается остается 2 утечки.
Вот если удалить юнита (Remove unit), то он стирается из события другого триггера?
Не используй событие "каждые n сек". Я уже написал, как нужно делать.
Чтобы заменять только нужный тип юнитов, в действиях пиши первую строку из того, что я написал, а дальше условие "если тип юнита u равно id (равкод) нужного тебе юнита, то",в теле этого условия пиши всё, что после первой строки.
когда ты вешаешь бафф, то в системе урона ("событие - юнит получает урон") всплывает "нолик". Короче система будет показывать, что нанесли 0 единиц урона (хотя урона нет никакого). Можно узнать дамагера, ну и кто повесил баффик (кто повесил бафф можно также узнать по событию - юнит приводит способность в действие, переводится как приводит эффект в действие, типа эффект это бафф) Кстати сразу узнать есть ли бафф у юнита по событию может и не получится, обычно через ноль секунд (типа эффект не сразу накладывает, точно также как и с событие урона, урон есть, но его еще не нанесли, только через 0.00 сек. ).
Размер карты-то изначально известен, можно обойтись и рандомом между статичными цифирями. Думал над этим вариантом тоже, значит будем пользовать его. nvc123:
к слову этот вообще не рабочий ибо количество итераций циклов может превысить лимит потока и тогда триггер просто обрубится
Ставить таймеры по 0.5 сек? Такого вида?
loop
exitwhen IsUnitDeadBJ(BET) or BECo > 20
if (TimerGetRemaining(t) <= 0) then
call MoveLocation( p, GetRandomReal ( X1, X2), GetRandomReal (Y1, Y2))
call SetUnitMoveSpeed( BET, 500.00 )
call IssuePointOrderLocBJ( BET, "move", p )
set BECo = BECo + 0.5
call TimerStart(t, 0.5, false, null)
endif
endloop
Таймер не вейт, он запустить новый Поток когда истечет, в функции старта таймера 4 параметра, таймер, время, периодичный буль и ссылка на код .
вместо null нужно вписать function Имя функции
functiom Timer_UnitMove_Expires takes nothing returns nothing
// эта функция будет вызыватся каждые 0.50 сек. пока не остановить таймер
endfunction
function A takes nothing returns nothing
local timer t = CreateTimer( )
call TimerStart( t, 0.50, true, function Timer_UnitMove_Expires )
set t = null
endfunction
Чтобы передавать информацию между функциями нужны так называемые Аттачи, нужно прикрепить данные к триггеру или таймеру, потому что мы можем получить ссылку на них в запущенных ими потоками.
Про хештаблицу куча данных на сайте, SaveUnitHandle( хештаблица, ключ 1, ключ 2, сам юнит )
должен сразу предупредить что делать за тебя никто не будет
теперь по твоим вопросам
чтобы нельзя было кликать скрываешь, даёшь москиты, делаешь видимым
действие проиграть звук и указываешь твою фразу
выбираем всех подходящих(враги,живые) юнитов в радиусе от точки каста и создаём по дамми юниту(юнит без модели, без атаки, с москитами, с нужной способность, время жизни юнита 1 сек) для каждого подходящего юнита приказывая дамми юниту применить нужную способность в подходящего юнита
таким образом каждый дамми юнит применит нужную способность (в твоём случае корни) в 1 подходящего юнита для которого он и был создан а потом исчезнет
ИИ написать, сами скиллы юзают тока крипы подконтрольные ИИ - к примеру нейтральновраждебные.
Так же можно юзать скилл - Сфера замедления, это орб эффект который срабатывая накладывает на цель атаки указанный в его настройках скилл, подойдет для карт типа Castle Fight.
ИИ чтоли не кастует? Сделай триггерный каст, Событие - юнит обнаружил цель в пределах досягаемости, проглотить не в кулдауне и цель неуязвимый враг, пойти и проглотить юнита...
Fireproof, попробуй в РО у юнита поменять "Графика - Анимация - обратный ход броска" и "Графика - Анимация - точка броска" на 0. Правда, это уберёт время каста для всех умений у этого юнита.
Ну тебе нужно чтобы был прямо таки бафф который можно рассеивать?
Для начала сделай способность, и баф на основе какой нибудь пустышки, подойдет ярость у некромантов, так же переодический триггер который раз в пол секунды проверяет всех юнитов в группе, есть ли у них бафф если юнит мертв или у него нет баффа, то у юнита удаляется способность на доп урон зданиям и сам унит удаляется из группы.
При касте твоим шаманов заклинания на цель, ты добавляешь цель заклинания в группу, которую и перебирает описанный выше триггер.
Надеюсь понятно?
datar1231, Именно поэтому говорят не делать 2 две способности от друга потому когда юнита приходит приказ на использование способности он использует твою нестандартную способность но основываясь на айди стандартной способности или делай на основе другой или незанаю подействует ли канал.
» WarCraft 3 / Вылетает карта
» WarCraft 3 / защита карты
» WarCraft 3 / Экспорт моделей
» WarCraft 3 / виндволк
» WarCraft 3 / Сквозь юнита
» WarCraft 3 / Стан
» WarCraft 3 / Москиты
» WarCraft 3 / Не выделяемый юнит
» WarCraft 3 / Как сделать способность?
» WarCraft 3 / Способности и текст
» WarCraft 3 / Поворот
» WarCraft 3 / Возможно ли такое
» WarCraft 3 / Переменные.
» WarCraft 3 / Предметы
» WarCraft 3 / По моделям.
» WarCraft 3 / хочу найти карту с моделями
» WarCraft 3 / Грейд
» WarCraft 3 / Двойной урон
» WarCraft 3 / Общие войска
» WarCraft 3 / Ландшафт
» WarCraft 3 / Запрет передачи предметов
» WarCraft 3 / Многие юнитов
» WarCraft 3 / IsUnitDeadBJ()
» WarCraft 3 / Как создать героя на которого действуют только способности
» WarCraft 3 / Не использовали способности.